🚀 实战指南:VPS + Frp + Docker 打造高速隧道

头像
2025年11月28日

本教程旨在解决以下痛点: 1. 家庭宽带无公网 IP 或 80/443 端口被封,无法直接建站。 2. 海外访问国内家庭服务速度慢,Cloudflare 免费版在国内体验不佳。 3. 无需备案,利用高性能回国线路 VPS 实现低延迟访问。

# Frp 高速隧道
🚀 实战指南:VPS + Frp + Docker 打造高速隧道

📖 简介

本教程旨在解决以下痛点:

  • 家庭宽带无公网 IP 或 80/443 端口被封,无法直接建站。
  • 海外访问国内服务速度慢,Cloudflare 免费版在国内体验不佳。
  • 无需备案,利用高性能线路 VPS 实现低延迟访问。

架构方案:

用户 (HTTPS) -> VPS (Frp 服务端) -> 加密隧道 -> 家庭服务器 (Frp 客户端) -> 本地 Nginx (解密/响应)


🛠️ 准备工作

  1. VPS 一台: 推荐 ClawCloud(香港/新加坡/日本),线路优化且带宽大。
  2. 家庭服务器: 需安装 Docker 和 Nginx。
  3. 域名一个: 托管在 Cloudflare/阿里云等,用于申请 SSL 证书。
  4. 生成 Token: 在终端运行 openssl rand -hex 16 生成一个连接密码。

第一步:服务端部署 (ClawCloud VPS)

环境: Ubuntu / Debian目标: 安装 frps,开启 HTTPS 监听,配置开机自启。

1. 下载并安装

# 下载最新版 Frp (请去 GitHub Release 页面确认最新版本号)
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz

# 解压并安装
tar -zxvf frp_0.58.1_linux_amd64.tar.gz
sudo mv frp_0.58.1_linux_amd64/frps /usr/local/bin/
sudo chmod +x /usr/local/bin/frps

# 创建配置目录
sudo mkdir -p /etc/frp

2. 配置文件 (/etc/frp/frps.toml)

Ini, TOML

# frps 内部通讯端口
bindPort = 7000

# 【关键】对外监听 HTTPS 端口,接收公网 443 流量
vhostHTTPSPort = 443

# 身份验证 (请替换为你自己的)
auth.method = "token"
auth.token = "a1b2c3d4e5f678901234567890abcdef"

# 仪表盘配置 (可选)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"

3. 配置 Systemd 开机自启 (/etc/systemd/system/frps.service)

Ini, TOML

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml

[Install]
WantedBy=multi-user.target

4. 启动服务与防火墙

# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable frps --now

# 开放系统防火墙
sudo ufw allow 7000/tcp
sudo ufw allow 443/tcp
sudo ufw allow 7500/tcp

⚠️ 注意: 别忘了去 VPS 厂商的网页控制台(安全组)里也放行上述端口!


第二步:客户端部署 (家庭服务器)

环境: Docker目标: 通过 Docker 部署 frpc,透传 HTTPS 流量给宿主机 Nginx。

1. 配置文件 (~/frp/frpc.toml)

Ini, TOML

# 填写 VPS 的公网 IP
serverAddr = "1.2.3.4"
serverPort = 7000

# 必须与服务端一致
auth.method = "token"
auth.token = "a1b2c3d4e5f678901234567890abcdef"

# 【关键】开启 TLS 加密,防止过墙时连接被重置 (Connection reset)
transport.tls.enable = true

# --- 转发规则 ---
[[proxies]]
name = "home_web"
type = "https"  # https 模式表示透传加密流量,不进行解密
customDomains = ["www.yourdomain.com"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:443" # 指向宿主机 Nginx 监听的 SSL 端口

2. Docker Compose 文件 (~/frp/docker-compose.yml)

version: '3.8'
services:
  frpc:
    image: snowdreamtech/frpc:latest
    container_name: frpc
    restart: always
    # 【关键】使用 host 模式,让容器能直接访问宿主机的 Nginx 端口
    network_mode: "host"
    volumes:
      - ./frpc.toml:/etc/frp/frpc.toml

3. 启动客户端

cd ~/frp
docker compose up -d

# 查看日志确认连接成功 (看到 "start proxy success" 即为成功)
docker logs -f frpc

第三步:本地 Nginx 配置 (SSL 终点)

由于是 HTTPS 透传,SSL 证书必须配置在家庭服务器的 Nginx 上

Nginx 配置示例

server {
    # 监听本地 443 (运营商封锁外网 443 不影响内网监听)
    listen 443 ssl;
    server_name www.yourdomain.com;

    # SSL 证书路径
    ssl_certificate /etc/nginx/cert/yourdomain.pem;
    ssl_certificate_key /etc/nginx/cert/yourdomain.key;

    location / {
        root /var/www/html;
        index index.html;
    }
}

💡 提示: 推荐使用 acme.shCertbot 配合 DNS API 方式申请证书,这样无需 80 端口即可自动续期。


第四步:DNS 解析

前往你的域名服务商(Cloudflare/阿里云):

  1. 添加一条 A 记录
  2. 主机记录:www
  3. 记录值:ClawCloud VPS 的公网 IP
  4. (如果是 Cloudflare)关闭小黄云 (Proxy Status: DNS Only),让流量直连 VPS。

🚑 常见问题排查 (Troubleshooting)

Q1: 启动报错 Connection lost before handshake

  • 原因1: VPS 和家庭服务器系统时间不一致。请同步时间。
  • 原因2: 被 GFW 识别阻断。请确保 frpc.toml 中开启了 transport.tls.enable = true

Q2: 网页访问 502 Bad Gateway?

  • Frp 连接正常,但找不到本地 Nginx。
  • 检查 Docker 是否开启了 network_mode: "host"
  • 检查 localAddr 端口是否与 Nginx listen 端口一致。

Q3: Dashboard (7500端口) 打不开?

  • 检查 frps.toml 中是否配置了 webServer.addr = "0.0.0.0"
  • 重点检查: 阿里云/ClawCloud 网页控制台的安全组是否放行了 7500 端口。

Q4: 证书报错 / 隐私错误?

  • 确认 Nginx 配置了正确的证书,且域名与访问域名一致。Frp 只是搬运工,证书错误是 Nginx 的问题。